package br.com.cast.scc.veiculo;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.form.ChoiceRenderer;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.FormComponent;
import org.apache.wicket.markup.html.form.IChoiceRenderer;
import org.apache.wicket.markup.html.form.RequiredTextField;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.spring.injection.annot.SpringBean;

import br.com.cast.scc.model.DominioTipoVeiculo;
import br.com.cast.scc.model.Veiculo;
import br.com.cast.scc.service.DominioTipoVeiculoService;
import br.com.cast.scc.service.VeiculoService;

public class CadastrarVeiculoForm extends Form<Veiculo> {
	private static final long serialVersionUID = 1L;

	@SpringBean(name = "veiculoServiceImpl")
	private VeiculoService veiculoService;

	@SpringBean(name = "dominioTipoVeiculoServiceImpl")
	private DominioTipoVeiculoService dominioTipoVeiculoService;

	private WebMarkupContainer panelCamposTerrestres;

	private WebMarkupContainer panelCamposFluviais;

	private DropDownChoice<DominioTipoVeiculo> tipoVeiculo;

	public CadastrarVeiculoForm(String id) {
		super(id, new CompoundPropertyModel<>(new Veiculo()));

		add(new FeedbackPanel("msgErro"));
		criaPaineisCampos();
		criaCampoTipo();
		criaCampoNuEmbarcacao();
		criaCampoRNTRC();
		FormComponent<String> placa1 = criaCampoPlaca("placa1")
				.setRequired(true);
		
		FormComponent<String> placa2 = criaCampoPlaca("placa2")
				.setRequired(true);
		
		FormComponent<String> placa3 = criaCampoPlaca("placa3")
				.setRequired(true);
		
		FormComponent<String> placa4 = criaCampoPlaca("placa4")
				.setRequired(true);
		
		add(new PlacasIguaisValidator(
				placa1
				,placa2
				,placa3
				,placa4
		));
		
		criaCampoEndAcesso();
		
		criaCampoLoginAcesso();
		
		criaCampoSenhaAcesso();
		addBehaviorVisibilidade();
		add(panelCamposTerrestres, panelCamposFluviais);

		criaLinkSalvar();

	}

	private void addBehaviorVisibilidade() {
		ControleVisibilidadeCamposVeiculo behavior = new Contr
		
	}

	private void criaCampoSenhaAcesso() {
		add(new RequiredTextField<>("senhaAcesso"));

	}

	private void criaCampoLoginAcesso() {
		add(new RequiredTextField<>("loginAcesso"));

	}

	private void criaCampoEndAcesso() {
		add(new RequiredTextField<>("endAcessoLink"));

	}

	private void criaCampoNuEmbarcacao() {
		panelCamposFluviais.add(new TextField<>("nuEmbarcacao"));

	}

	private void criaPaineisCampos() {
		panelCamposTerrestres = new WebMarkupContainer("panelCamposTerrestres");
		panelCamposTerrestres.setVisible(false);
		panelCamposTerrestres.setOutputMarkupPlaceholderTag(true);

		panelCamposFluviais = new WebMarkupContainer("panelCamposFluviais");
		panelCamposFluviais.setVisible(false);
		panelCamposFluviais.setOutputMarkupPlaceholderTag(true);

	}

	private void criaLinkSalvar() {
		add(new AjaxButton("salvar") {
			private static final long serialVersionUID = 1L;

			@Override
			protected void onSubmit(AjaxRequestTarget target, Form<?> form) {

				Veiculo veiculo = (Veiculo) form.getDefaultModelObject();
				veiculoService.salvar(veiculo);

			}

		});

	}

	private TextField<String> criaCampoPlaca(String id) {
		TextField<String> placa = new TextField<>(id);
		panelCamposTerrestres.add(new TextField<>(id));
		return placa;

	}

	private void criaCampoRNTRC() {
		panelCamposTerrestres.add(new RequiredTextField<>("rntrc"));

	}

	private void criaCampoTipo() {
		IChoiceRenderer<DominioTipoVeiculo> renderer = new ChoiceRenderer<>(
				"descricao");
		final DropDownChoice<DominioTipoVeiculo> tipoVeiculo = new DropDownChoice<DominioTipoVeiculo>(
				"tpVeiculo", dominioTipoVeiculoService.consultaTodos(),
				renderer);
		tipoVeiculo.add(new AjaxFormComponentUpdatingBehavior("change") {
			private static final long serialVersionUID = 1L;

			@Override
			protected void onUpdate(AjaxRequestTarget target) {
				DominioTipoVeiculo tipo = tipoVeiculo.getModelObject();

				boolean isTerrestre = tipo.getCodigo().equals(
						DominioTipoVeiculo.COD_TERRESTRE);

				panelCamposTerrestres.setVisible(isTerrestre);
				panelCamposFluviais.setVisible(!isTerrestre);

				target.add(panelCamposTerrestres, panelCamposFluviais);

			}

		});
		add(tipoVeiculo);

	}
}
